package com.rainyun.rc.orm;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import com.rainyun.rc.common.VersionException;

public interface RainSql {
	
	/**初始化操作(如创表,文件,覆盖兼容版本),同时对表版本进行检查
	 * ,若版本不兼容,则抛出异常
	 *  如果出现其他错误,返回false
	 * @return 
	 * */	
	public boolean init() throws VersionException,SQLException;
	
	//终止语句
	/**执行查询,获取查询的所有数据,返回实体list*/
	public <T> List<T> get() throws SQLException;
	
	/**利用现有参数执行查询语句*/
	public List<Map<String, Object>> doQuery() throws SQLException;
	
	/**利用现有参数执行增删改语句,返回成功操作的行数(excuteUpdate)*/
	public int doUpdate() throws SQLException;
	
	/**执行查询,获取第一条数据,返回数据实体*/
	public <T> T first() throws SQLException;
	
	/**删除数据*/
	public int delete() throws SQLException;
	
	//获取原始数据
	/**执行查询,获取所有查询数据*/
	public List<Map<String,Object>> getResultAll() throws SQLException;
	/**执行查询,获取所有查询数据的第一列,组成list*/
	public<V> List<V> getResultList() throws SQLException;
	/**执行查询,获取第一条数据的第一项*/
	public<V> V getResult() throws SQLException;
	/**执行查询,获取第一条数据*/
	public Map<String,?> getResultMap() throws SQLException;
	
	//快捷语句
	/**快捷语句,根据第一主键查询数据实体*/
	public<T> T find(Object key) throws SQLException;
	
	/**快捷语句,根据第一主键删除数据实体*/
	public boolean delete(Object key) throws SQLException;
	/**快捷语句,插入数据*/
	public int insert(Object obj) throws SQLException;
	/**快捷语句,根据主键覆盖数据(插入或更新)*/
	public int save(Object obj) throws SQLException;
	
	//常规语句
	/**修改数据*/
	public RainSql update(String col_name,Object value);
	/**过滤语句*/
	public RainSql where(String col_name,String op,Object... val);
	/**过滤语句(OR)*/
	public RainSql orWhere(String col_name,String op,Object... val);
	/**限制查询条数*/
	public RainSql limit(int offset,int length);
	/**排序
	 * @param 排序列
	 * @param 是否倒序*/
	public RainSql orderBy(String col_name,boolean isDesc);
	/**分页
	 * @param page 页数
	 * @param length 每页长度*/
	public RainSql toPage(int page,int length);
	
	/**手动连表操作,一般情况下少用*/
	public RainSql join(String sql,Object... args);
	
	//max,min,count,avg,sum
	/**查询指定列*/
	public RainSql select(String... cols);
	/**分组查询*/
	public RainSql groupBy(String... cols);
	/**自动通过实体关联对应表*/
	public RainSql refer(Class<?> ...clazz);

}
